JavaScriptã®ãããã¬ãã«ã€ã³ããŒãïŒã¢ãžã¥ãŒã«åæåãã¿ãŒã³ | MLOG | MLOG
2025幎8æ16æ¥ æ¥æ¬èª
ãããã¬ãã«awaitïŒTLAïŒã䜿çšããé«åºŠãªJavaScriptã¢ãžã¥ãŒã«åæåãã¿ãŒã³ãæ¢ããŸããããŒã¿ååŸãäŸåæ§æ³šå
¥ãåçèšå®ã®ãã¹ããã©ã¯ãã£ã¹ãåŠã³ãŸãããã
JavaScriptã®ãããã¬ãã«ã€ã³ããŒãïŒã¢ãžã¥ãŒã«åæåãã¿ãŒã³
çŸä»£ã®JavaScriptéçºã¯ãã¢ãžã¥ãŒã«ã«å€§ããäŸåããŠããŸããECMAScriptã¢ãžã¥ãŒã«ïŒESMïŒã¯æšæºãšãªããã³ãŒãã®åå©çšæ§ãäŸåé¢ä¿ç®¡çãããã©ãŒãã³ã¹åäžãšãã£ãå©ç¹ãæäŸããŸãããããã¬ãã«awaitïŒTLAïŒã®å°å
¥ã«ãããã¢ãžã¥ãŒã«ã®åæåã¯ããã«åŒ·åãã€æè»ã«ãªããŸããããã®èšäºã§ã¯ãTLAã䜿çšããé«åºŠãªã¢ãžã¥ãŒã«åæåãã¿ãŒã³ãæ¢ããå®è·µçãªäŸãšãã¹ããã©ã¯ãã£ã¹ãæäŸããŸãã
ãããã¬ãã«awaitïŒTLAïŒãšã¯ïŒ
ãããã¬ãã«awaitã¯ãawaitããŒã¯ãŒããasync颿°ã®å€ãJavaScriptã¢ãžã¥ãŒã«å
ã§çŽæ¥äœ¿çšã§ããããã«ããæ©èœã§ããããã«ããããããã¹ã解決ããããŸã§ã¢ãžã¥ãŒã«ã®å®è¡ãäžæåæ¢ã§ãããããã¢ãžã¥ãŒã«ã䜿çšãããåã«ããŒã¿ãååŸããããæ¥ç¶ãåæåããããèšå®ãèªã¿èŸŒãã ãããã¿ã¹ã¯ã«æé©ã§ããTLAã¯ã¢ãžã¥ãŒã«ã¬ãã«ã§ã®éåææäœãç°¡çŽ åããããã¯ãªãŒã³ã§èªã¿ãããã³ãŒãã«ã€ãªãããŸãã
ãããã¬ãã«awaitã®å©ç¹
éåæåæåã®ç°¡çŽ åïŒ éåæã»ããã¢ãããåŠçããããã®å³æå®è¡éåæé¢æ°ïŒIIAFEïŒã®å¿
èŠæ§ãåé¿ããŸãã
å¯èªæ§ã®åäžïŒ éåæåæåããžãã¯ãããæç€ºçã§çè§£ããããããŸãã
äŸåé¢ä¿ç®¡çïŒ ä»ã®ã¢ãžã¥ãŒã«ã«ãã£ãŠã€ã³ããŒããã䜿çšãããåã«ãã¢ãžã¥ãŒã«ãå®å
šã«åæåãããããšãä¿èšŒããŸãã
åçèšå®ïŒ å®è¡æã«èšå®ããŒã¿ãååŸã§ãããããæè»ã§é©å¿æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãå¯èœã«ãªããŸãã
TLAã䜿çšããäžè¬çãªã¢ãžã¥ãŒã«åæåãã¿ãŒã³
1. ã¢ãžã¥ãŒã«èªã¿èŸŒã¿æã®ããŒã¿ååŸ
TLAã®æãäžè¬çãªäœ¿çšäŸã®1ã€ã¯ãã¢ãžã¥ãŒã«ã®åæåäžã«å€éšAPIãããŒã¿ããŒã¹ããããŒã¿ãååŸããããšã§ããããã«ãããã¢ãžã¥ãŒã«ã®é¢æ°ãåŒã³åºãããåã«å¿
èŠãªããŒã¿ãå©çšå¯èœã§ããããšãä¿èšŒãããŸãã
äŸïŒ
// config.js
const configData = await fetch('/api/config').then(res => res.json());
export const apiKey = configData.apiKey;
export const apiUrl = configData.apiUrl;
Copy
ãã®äŸã§ã¯ãconfig.jsã¢ãžã¥ãŒã«ãèªã¿èŸŒãŸããéã«/api/configããèšå®ããŒã¿ãååŸããŸããapiKeyãšapiUrlã¯ãããŒã¿ãæ£åžžã«ååŸãããåŸã«ã®ã¿ãšã¯ã¹ããŒããããŸããconfig.jsãã€ã³ããŒãããã¢ãžã¥ãŒã«ã¯ãããã«èšå®ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã
2. ããŒã¿ããŒã¹æ¥ç¶ã®åæå
TLAã¯ãã¢ãžã¥ãŒã«ã®åæåäžã«ããŒã¿ããŒã¹æ¥ç¶ã確ç«ããããã«äœ¿çšã§ããŸããããã«ãããããŒã¿ããŒã¹æäœãå®è¡ãããåã«ããŒã¿ããŒã¹æ¥ç¶ãæºåã§ããŠããããšãä¿èšŒãããŸãã
äŸïŒ
// db.js
import { MongoClient } from 'mongodb';
const uri = 'mongodb+srv://user:password@cluster0.mongodb.net/?retryWrites=true&w=majority';
const client = new MongoClient(uri);
await client.connect();
export const db = client.db('myDatabase');
Copy
ããã§ã¯ãdb.jsã¢ãžã¥ãŒã«ãMongoClientã䜿çšããŠMongoDBããŒã¿ããŒã¹ã«æ¥ç¶ããŸããawait client.connect()ã«ãããdbãªããžã§ã¯ãããšã¯ã¹ããŒããããåã«æ¥ç¶ã確ç«ãããããšãä¿èšŒãããŸããä»ã®ã¢ãžã¥ãŒã«ã¯db.jsãã€ã³ããŒãããdbãªããžã§ã¯ãã䜿çšããŠããŒã¿ããŒã¹æäœãå®è¡ã§ããŸãã
3. åçãªèšå®ã®èªã¿èŸŒã¿
TLAã¯ãç°å¢ããã®ä»ã®èŠå ã«åºã¥ããŠèšå®ããŒã¿ãåçã«èªã¿èŸŒãããšãå¯èœã«ããŸããããã«ãããå®è¡æã«èšå®ã§ããæè»ã§é©å¿æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãå®çŸããŸãã
äŸïŒ
// config.js
const environment = process.env.NODE_ENV || 'development';
let config;
if (environment === 'production') {
config = await import('./config.production.js');
} else {
config = await import('./config.development.js');
}
export default config;
Copy
ãã®äŸã§ã¯ãconfig.jsã¢ãžã¥ãŒã«ã¯NODE_ENVç°å¢å€æ°ã«åºã¥ããŠconfig.production.jsãŸãã¯config.development.jsãåçã«ã€ã³ããŒãããŸããããã«ãããç°ãªãç°å¢ã§ç°ãªãèšå®ã䜿çšã§ããŸãã
4. äŸåæ§æ³šå
¥
TLAã¯ãåæåäžã«ã¢ãžã¥ãŒã«ã«äŸåæ§ã泚å
¥ããããã«äœ¿çšã§ããŸããããã«ãããäŸåæ§ãç°¡åã«ã¢ãã¯ããã眮ãæãããã§ãããããæè»æ§ãšãã¹ãã®ãããããåäžããŸãã
äŸïŒ
// api.js
let httpClient;
export async function initialize(client) {
httpClient = client;
}
export async function fetchData(url) {
if (!httpClient) {
throw new Error('API module not initialized. Call initialize() first.');
}
const response = await httpClient.get(url);
return response.data;
}
Copy
// app.js
import * as api from './api.js';
import axios from 'axios';
await api.initialize(axios);
const data = await api.fetchData('/api/data');
console.log(data);
Copy
ããã§ã¯ãapi.jsã¢ãžã¥ãŒã«ãå€éšã®HTTPã¯ã©ã€ã¢ã³ãïŒaxiosïŒã䜿çšããŸããfetchDataãåŒã³åºãåã«ãã¯ã©ã€ã¢ã³ãã€ã³ã¹ã¿ã³ã¹ãæå®ããŠapi.initializeãåŒã³åºãå¿
èŠããããŸããapp.jsã§ã¯ãTLAã«ãã£ãŠåæåãã§ãŒãºäžã«axiosãapiã¢ãžã¥ãŒã«ã«æ³šå
¥ãããããšãä¿èšŒãããŸãã
5. åæåãããå€ã®ãã£ãã·ã¥
ç¹°ãè¿ãã®éåææäœãé¿ããããã«ãåæåããã»ã¹ã®çµæããã£ãã·ã¥ã§ããŸããããã«ãããããã©ãŒãã³ã¹ãåäžãããªãœãŒã¹æ¶è²»ãåæžãããŸãã
äŸïŒ
// data.js
let cachedData = null;
async function fetchData() {
console.log('Fetching data...');
// Simulate fetching data from an API
await new Promise(resolve => setTimeout(resolve, 1000));
return { message: 'Data from API' };
}
export async function getData() {
if (!cachedData) {
cachedData = await fetchData();
}
return cachedData;
}
export default await getData(); // Export the promise directly
Copy
// main.js
import data from './data.js';
console.log('Main script started');
data.then(result => {
console.log('Data available:', result);
});
Copy
ãã®äŸã§ã¯ãdata.jsã¯TLAã䜿çšããŠããã£ãã·ã¥ãããããŒã¿ã«è§£æ±ºããããããã¹ããšã¯ã¹ããŒãããŸããgetData颿°ã¯ãããŒã¿ãäžåºŠã ãååŸãããããšãä¿èšŒããŸããdata.jsãã€ã³ããŒãããã¢ãžã¥ãŒã«ã¯ãå¥ã®éåææäœãããªã¬ãŒããããšãªãããã£ãã·ã¥ãããããŒã¿ãåãåããŸãã
ãããã¬ãã«awaitã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
ãšã©ãŒãã³ããªã³ã°ïŒ TLAã䜿çšããéã¯ãéåææäœäžã«çºçããå¯èœæ§ã®ããäŸå€ããã£ããããããã«ãåžžã«ãšã©ãŒãã³ããªã³ã°ãå«ããŠãã ãããtry...catchãããã¯ã䜿çšããŠãšã©ãŒãé©åã«åŠçããŸãã
ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ïŒ TLAã䜿çšããéã¯ãã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã«æ³šæããŠãã ãããä»ã®ã¢ãžã¥ãŒã«ã§äœ¿çšãããåã«ãäŸåé¢ä¿ãé©åã«åæåãããŠããããšã確èªããŠãã ããã埪ç°äŸåã¯äºæããªãåäœãåŒãèµ·ããå¯èœæ§ããããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ
®äºé
ïŒ TLAã¯éåæåæåãç°¡çŽ åããŸãããæ³šæããŠäœ¿çšããªããšããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããã¢ãžã¥ãŒã«ã®åæåäžã«é·æéå®è¡ãããããŸãã¯ãªãœãŒã¹ã倧éã«æ¶è²»ããæäœã¯é¿ããŠãã ããã
ãã©ãŠã¶ã®äºææ§ïŒ ã¿ãŒã²ãããã©ãŠã¶ãTLAããµããŒãããŠããããšã確èªããŠãã ãããã»ãšãã©ã®ææ°ãã©ãŠã¶ã¯TLAããµããŒãããŠããŸãããå€ããã©ãŠã¶ã§ã¯ãã©ã³ã¹ãã€ã«ãããªãã£ã«ãå¿
èŠã«ãªãå ŽåããããŸãã
ãã¹ãïŒ ã¢ãžã¥ãŒã«ãé©åã«åæåãããéåææäœãæ£ããåŠçãããããšã確èªããããã«ã培åºçãªãã¹ããèšè¿°ããŠãã ãããäŸåé¢ä¿ãã¢ãã¯ããããŸããŸãªã·ããªãªãã·ãã¥ã¬ãŒãããŠãã³ãŒãã®åäœãæ€èšŒããŸãã
ãšã©ãŒãã³ããªã³ã°ã®äŸïŒ
// data.js
try {
const response = await fetch('/api/data');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
export const data = await response.json();
} catch (error) {
console.error('Failed to fetch data:', error);
export const data = { error: 'Failed to load data' }; // Provide a fallback
}
Copy
ãã®äŸã¯ãTLAã䜿çšããŠããŒã¿ãååŸããéã®ãšã©ãŒåŠçæ¹æ³ã瀺ããŠããŸããtry...catchãããã¯ã¯ããã§ããæäœäžã«çºçããå¯èœæ§ã®ããäŸå€ããã£ããããŸãããšã©ãŒãçºçããå Žåãã¢ãžã¥ãŒã«ãã¯ã©ãã·ã¥ããã®ãé²ãããã«ããã©ãŒã«ããã¯å€ããšã¯ã¹ããŒããããŸãã
é«åºŠãªã·ããªãª
1. ãã©ãŒã«ããã¯ä»ãã®åçã€ã³ããŒã
TLAã¯åçã€ã³ããŒããšçµã¿åãããããšã§ãç¹å®ã®åºæºã«åºã¥ããŠã¢ãžã¥ãŒã«ãæ¡ä»¶ä»ãã§èªã¿èŸŒãããšãã§ããŸããããã¯ãæ©èœãã©ã°ãA/Bãã¹ããå®è£
ããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒ
// feature.js
let featureModule;
try {
featureModule = await import('./feature-a.js');
} catch (error) {
console.warn('Failed to load feature A, falling back to feature B:', error);
featureModule = await import('./feature-b.js');
}
export default featureModule;
Copy
2. WebAssemblyã¢ãžã¥ãŒã«ã®åæå
TLAã¯ãWebAssemblyã¢ãžã¥ãŒã«ãéåæã«åæåããããã«äœ¿çšã§ããŸããããã«ãããWebAssemblyã¢ãžã¥ãŒã«ãä»ã®ã¢ãžã¥ãŒã«ããã¢ã¯ã»ã¹ãããåã«ãå®å
šã«èªã¿èŸŒãŸããäœ¿çšæºåãæŽã£ãŠããããšãä¿èšŒãããŸãã
äŸïŒ
// wasm.js
const wasmModule = await WebAssembly.instantiateStreaming(fetch('module.wasm'));
export const { instance } = wasmModule;
Copy
ã°ããŒãã«ãªèæ
®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«JavaScriptã¢ãžã¥ãŒã«ãéçºããå Žåã以äžãèæ
®ããŠãã ããïŒ
ã¿ã€ã ãŸãŒã³ïŒ æ¥ä»ãšæå»ãæ±ãéã¯ãMoment.jsãdate-fnsã®ãããªã©ã€ãã©ãªã䜿çšããŠãç°ãªãã¿ã€ã ãŸãŒã³ãæ£ããåŠçããŠãã ããã
ããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒ i18nextã®ãããªããŒã«ã©ã€ãŒãŒã·ã§ã³ã©ã€ãã©ãªã䜿çšããŠãè€æ°ã®èšèªããµããŒãããŠãã ããã
éè²šïŒ é貚ãã©ãŒãããã©ã€ãã©ãªã䜿çšããŠãç°ãªãå°åã«é©ãã圢åŒã§é貚ã衚瀺ããŠãã ããã
ããŒã¿åœ¢åŒïŒ æ¥ä»ãæ°å€ã®åœ¢åŒãªã©ãç°ãªãå°åã§äœ¿çšãããããŸããŸãªããŒã¿åœ¢åŒã«æ³šæããŠãã ããã
çµè«
ãããã¬ãã«awaitã¯ãJavaScriptã«ãããéåæã¢ãžã¥ãŒã«åæåãç°¡çŽ åãã匷åãªæ©èœã§ããTLAã䜿çšããããšã§ãããã¯ãªãŒã³ã§ãèªã¿ããããä¿å®ããããã³ãŒããæžãããšãã§ããŸãããã®èšäºã§ã¯ãTLAã䜿çšããããŸããŸãªã¢ãžã¥ãŒã«åæåãã¿ãŒã³ãæ¢ããå®è·µçãªäŸãšãã¹ããã©ã¯ãã£ã¹ãæäŸããŸããããããã®ã¬ã€ãã©ã€ã³ã«åŸãããšã§ãTLAãæŽ»çšããŠå
ç¢ã§ã¹ã±ãŒã©ãã«ãªJavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããããã®ãã¿ãŒã³ãåãå
¥ããããšã§ãããå¹ççã§ä¿å®ããããã³ãŒãããŒã¹ãå®çŸããéçºè
ã¯ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®é©æ°çã§åœ±é¿åã®ãããœãªã¥ãŒã·ã§ã³ã®æ§ç¯ã«éäžã§ããããã«ãªããŸãã
TLAã䜿çšããéã¯ãåžžã«ãšã©ãŒãåŠçããäŸåé¢ä¿ãæ
éã«ç®¡çããããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ
®ããããšãå¿ããªãã§ãã ãããæ£ããã¢ãããŒããçšããã°ãTLAã¯JavaScriptéçºã®ã¯ãŒã¯ãããŒã倧å¹
ã«æ¹åããããè€éã§æŽç·Žãããã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãå¯èœã«ããŸãã